<?php
namespace app\index\controller;

use app\index\model\User;
use think\Loader;

/**
 * 模型
 */
class H
{
    /**
     * 模型定义
     */

    // 模型类可以使用静态调用或者实例化调用两种方式
    public function index()
    {
        // 静态调用
        $User = User::get(5);
        $User->password = '123456';
        $User->save();

        // 实例化调用
        $U = new User();
        $U->username = '梅梅';
        $U->save();

        // 使用 Loader 类实例化（单例）
        $Ul  =Loader::model('User');

        // 使用助手函数`model`
        $Um = model('User');
        $Um->password = '321654';
        $Um->save();
    }


    /**
     * 新增数据
     */

    // 添加一条数据
    public function a()
    {
        // 第一种是实例化模型对象后赋值并保存
        $User = new User();
        $User->username = 'aaa';
        $User->email = 'aaa@126.com';
        $re = $User->save();

        // 使用data方法批量赋值
        $User = new User();
        $User->data([
            'username' => 'bbb',
            'password' => '123654',
            'email' => 'abc@126.com',
            'mobile' => '18258186898'
        ]);
        $re = $User->save();

        // 直接在实例化的时候传入数据
        $User = new User([
            'username' => 'ccc',
            'password' => '123555654',
            'email' => 'abcd@126.com',
            'mobile' => '18256666666'
        ]);
        $re = $User->save();

        // 过滤非数据表字段的数据
        $User = new User([
            'username' => 'ccc',
            'password' => '123555654',
            'email' => 'abcd@126.com',
            'mobile' => '18256666666',
            'aaa' => 'bbb',     // 没有这个字段
        ]);
        $re = $User->save();
        $re = $User->allowField(true)->save();

        // 通过外部提交赋值给模型，并且希望指定某些字段写入
        $User = new User([
            'username' => 'ccc',
            'password' => '123555654',
            'email' => 'abcd@126.com',
            'mobile' => '18256666666',
            'aaa' => 'bbb',     // 没有这个字段
        ]);
        // 数组中只有 username 和 mobile 字段会写入
        $re = $User->allowField(['username', 'mobile'])->save();
//        dump($re);
    }

    // 获取自增ID
    public function b()
    {
        $User = new User();
        $User->username = 'aaa';
        $User->email = 'aaa@126.com';
        $re = $User->save();
        // 获取自增ID
        echo $User->id;
    }

    // 注意不要在同一个实例里面多次新增数据，如果确实需要多次新增，那么可以用下面的方式
    public function c()
    {
        $User = new User();
        $User->username = 'aaa';
        $User->email = 'aaa@126.com';
        $User->save();

        $User->username = 'bbb';
        $User->email = 'bbb@126.com';
//        $re = $User->save();    // 错误写法
        // 第二次开始必须使用下面的方式新增
        $User->isUpdate(false)->save();
    }

    // 添加多条数据
    public function d()
    {
        $User = new User();
        $list = [
            [ 'username' => 'aaa', 'email' => 'abcd@126.com',],
            [ 'username' => 'bbb', 'email' => 'abcd@126.com',],
            [ 'username' => 'ccc', 'email' => 'abcd@126.com',],
        ];

        // 有主键，自动识别是更新还是新增
        $list = [
            [ 'username' => 'aaa', 'email' => 'abcd@126.com',],
            [ 'username' => 'bbb', 'email' => 'abcd@126.com',],
            [ 'id'=>15, 'username' => 'ddd', 'email' => '123456@126.com',],
        ];

//        $re = $User->saveAll($list);
        $re = $User->saveAll($list, false);    // 第二个为false，全是新增
        dump($re);
    }

    // 静态方法
    public function e()
    {
        // 直接静态调用create方法创建并写入
        $re = $User = User::create([ 'username' => 'eee', 'email' => 'eee@126.com',]);
//        dump($re);
    }

    // 助手函数
    public function f()
    {
        //
    }

    public function g()
    {

    }


    /**
     * 更新数据
     */

    public function h()
    {

    }


    /**
     * 删除数据
     */

    // 删除当前模型
    public function r()
    {
        // 删除模型数据，可以在实例化后调用delete方法
        $User = User::get(20);
        $User->delete();
    }

    // 根据主键删除
    public function s()
    {
        // 直接调用静态方法
        User::destroy(19);

        // 支持批量删除多个数据
        User::destroy('18,17');
        // 或者
        User::destroy([16,15]);
    }

    // 条件删除
    public function t()
    {
        // 使用数组进行条件删除
        User::destroy(['status'=>0]);

        // 还支持使用闭包删除
        User::destroy(function($query){
            $query->where('id', '>', 10);
        });

        // 通过数据库类的查询条件删除
        User::where('id', '>', 10)->delete();
    }

}